今天來做碰撞檢測
if ball_x <= 0 or ball_x >= screen_width - ball_radius:
ball_speed_x = -ball_speed_x
if ball_y <= 0:
ball_speed_y = -ball_speed_y
if ball_y >= screen_height:
running = False
paddle_rect = pygame.Rect(paddle_x, paddle_y, paddle_width, paddle_height)
if paddle_rect.collidepoint(ball_x, ball_y):
ball_speed_y = -ball_speed_y
for brick in bricks:
if brick.collidepoint(ball_x, ball_y):
bricks.remove(brick)
ball_speed_y = -ball_speed_y
break
碰撞檢測邏輯分析
牆壁碰撞檢測:
當球的 x 座標 (ball_x) 小於等於 0(左邊牆壁)或大於等於螢幕寬度減去球的半徑(右邊牆壁)時,表示球已經撞到左右牆壁,此時需要改變球的 x 軸速度方向 (ball_speed_x),這樣球才會反彈回來。利用 ball_speed_x = -ball_speed_x 這樣的程式碼,就可以讓球的水平移動方向改變。
球掉出底部的檢測:
當球的 y 座標超過視窗高度(ball_y >= screen_height)時,表示球已經掉到視窗外的底部。將 running 變數設為 False,從而結束主迴圈,停止遊戲。
擋板碰撞檢測:
首先使用 pygame.Rect 建立擋板的位置和大小(透過擋板的 x、y 座標以及寬度和高度)。接著使用 paddle_rect.collidepoint(ball_x, ball_y) 檢查球是否撞到擋板。如果碰撞到,則改變球的 y 軸速度方向 (ball_speed_y) 來讓球反彈。
磚塊碰撞檢測:
使用 for 迴圈來是指沿着某條路線,依次對每個磚塊做一次且僅做一次碰撞。 bricks 列表中的所有磚塊,每個磚塊透過 brick.collidepoint(ball_x, ball_y) 來確認球是否撞到它。如果撞到磚塊,則將該磚塊從列表中移除(bricks.remove(brick)),同時改變球的 y 軸速度方向,讓球進行反彈。break 語句用來確保每次碰撞只處理一個磚塊,避免重複檢測或出現邏輯錯誤。
這段程式碼雖然看起來簡單,但卻包含了很多基本概念。透過改變速度方向來模擬物體的反彈效果,是碰撞檢測中最常見的處理方式,這是網路上學到的。當球掉到螢幕底部時,如果沒有適當處理,球會繼續在視窗外部移動,遊戲也不會自動停止,這跟擋板一樣道理就是不能超出邊框。
那今天就先這樣。